 #include "drv_systick.h"
static uint16_t fs_us=0;
static uint16_t fs_ms=0;
/**************************************
函数名：drv_systick_init
函数功能：systick初始化
输入参数：系统时钟频率
输出参数：无
其它：
****************************************/
void drv_systick_init(uint32_t systick)
{
	// 设置时钟源为AHB/8
	SysTick->CTRL &= ~0x05;//关闭定时器，时钟8分频

	fs_us = systick/8;//计时1us的时间需要计的次数
	fs_ms = fs_us*1000;//计时1ms的时间需要计的次数
}
/**************************************
函数名：drv_systick_ms
函数功能：systick毫秒延时函数
输入参数：ms:需要延时的毫秒数
输出参数：无
其它：暂未考虑溢出问题，会有溢出风险
****************************************/
void drv_systick_ms(uint16_t ms)
{
	uint32_t temp=0;
	uint8_t systick_flg=0;

	while(systick_flg == 0)
	{
		if(ms > 798)
		{
			SysTick->LOAD = 798*fs_ms;//延时时间需要计总次数
			ms = ms - 798;
		}
		else
		{
			SysTick->LOAD = ms*fs_ms;//延时时间需要计总次数
			systick_flg = 1;
		}
		SysTick->VAL = 0;//清空当前值寄存器
		SysTick->CTRL |=0x01;//开启定时器
		do
		{
			temp = SysTick->CTRL;//获取控制状态寄存器的值
		}
		while (!(temp & (0x01<<16)));//判断定时时间是否到
		SysTick->CTRL &= ~0x01;//关闭定时器
	}
}

/**************************************
函数名：drv_systick_us
函数功能：systick微秒延时函数
输入参数：us:需要延时的毫秒数
输出参数：无
其它：暂未考虑溢出问题，会有溢出风险
****************************************/
void drv_systick_us(uint16_t us)
{
	uint32_t temp=0;

	SysTick->LOAD = us*fs_us;//延时时间需要计总次数
	SysTick->VAL = 0;//清空当前值寄存器
	SysTick->CTRL |=0x01;//开启定时器
	do
	{
		temp = SysTick->CTRL;//获取控制状态寄存器的值
	}
	while (!(temp & (0x01<<16)));//判断定时时间是否到
	SysTick->CTRL &= 0x01;//关闭定时器
}

